package com.cos.emp.web.controller;



import com.cos.emp.common.Const;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

/**
 * @author: COS
 * @time: 2022/5/24 16:22
 * @description:
 */
public class BaseServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //要访问的方法名称
        String method = request.getParameter("method");
        try {
            //这里 this 是子类的实例
            // 获取类对象
            Class<? extends BaseServlet> aClass = this.getClass();
            //把method 的参数直接作为方法名使用,参数列表固定为Request和Response
            //通过反射获取方法的对象  ctrl+alt +v
            Method childMethod = aClass.getMethod(method, HttpServletRequest.class, HttpServletResponse.class);
            //调用方法 使用this作为实例对象来调用方法
            //约定所有子类处理请求的方法都是返回字符串
            String invoke = (String) childMethod.invoke(this, request, response);
            System.out.println(invoke);
            //转发 重定向 json写出
            if (invoke == null) {
                //没有设置返回值,什么都不做
                return;
            }
            if (invoke.startsWith(Const.FORWARD)) {
                //forward:index.jsp subString  indexOf(":") rePlace("forward","")
                //1 获取需要转发的路径
                String path = invoke.replace(Const.FORWARD, "");
                //2 转发
                request.getRequestDispatcher(path).forward(request, response);
                System.out.println("转发啦啦啦啦啦啦");
            }else if(invoke.startsWith(Const.REDIRECT)){
                //1 获取需要重定向的路径
                String path = invoke.replace(Const.REDIRECT, "");
                //2 重定向
                response.sendRedirect(request.getContextPath()+"/"+path);
                System.out.println("重定向哈哈哈哈");
            }else{
                //写出json字符串
                response.getWriter().println(invoke);
            }
        } catch (Exception e) {
            e.printStackTrace();
            //如果用户输入路径错误,就返回到首页
            response.sendRedirect(request.getContextPath()+"/"+"error404.jsp");
        }
    }


}
